﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace MergeWI
{
    class Program
    {
        public static List<string> branchs = new List<string>() {"", "SINACLI", "SINAOMF", "SINAORD", "SINATES", "SINACCO" };
        public static List<string> diretorios = new List<string>() { "", "Clientes", "Bmf", "Bovespa", "Tesouraria", "ContaCorrente" };
        public static string padraoDiretorioUI = "$/{0}/NET/{1}/Source/UI/{2}";
        public static string padraoDiretorioServico = "$/{0}/NET/{1}/Source/Servicos/{2}";
        public static string padraoDiretorioProcess = "$/{0}/NET/{1}/Source/Process/{2}";
        public static string padraoDiretorioConfig = "$/{0}/NET/{1}/Config/UI/Application/{2}";
        public static List<string> tipos = new List<string>() {"", "PROD/P1I8/HTX", "PROD/P1I8/SPK", "ACE/P1I8/VC", "MAIN/VC/VC", "DEV/CDSB/VN","MAIN/VC/VC" };
        public static List<string> listaBranchs = new List<string>() { "", "HTX->SPK", "SPK->ACE", "ACE->MAIN", "MAIN->DEV", "DEV->MAIN","SHELVE->DEV" };

        static void Main(string[] args)
        {
            Process processo = null;
            string changeSet = string.Empty;
            string bug = string.Empty;
            string branch = string.Empty;
            string tipo = string.Empty;
            string diretorioOrigem = string.Empty;
            string diretorioDestino = string.Empty;
            string shelveName = string.Empty;
            string userName = string.Empty;
            string checkIn = "N";
            bool executado = false;

            while(checkIn.ToUpper() == "N")
            {

                Console.Write("Digite o ChangeSet:");
                changeSet = Console.ReadLine();
                Console.WriteLine("OK");

                if(!executado)
                {

                    Console.Write("Digite o(s) número(s) do(s) WorkItem(s):");
                    bug = Console.ReadLine();
                    Console.WriteLine("OK");

                    Console.WriteLine("Escolha o branch:");
                    Console.WriteLine("1 - SINACLI");
                    Console.WriteLine("2 - SINAOMF");
                    Console.WriteLine("3 - SINAORD");
                    Console.WriteLine("4 - SINATES");
                    Console.WriteLine("5 - SINACCO");
                    Console.WriteLine("6 - DIRETORIO");
                    branch = Console.ReadLine();
                    Console.WriteLine("OK");
                }


                if(branch.Trim() != "6")
                {
                    if(!executado)
                    {
                        Console.WriteLine("Escolha o tipo:");
                        Console.WriteLine("1 - HTX->SPK");
                        Console.WriteLine("2 - SPK->ACE");
                        Console.WriteLine("3 - ACE->MAIN");
                        Console.WriteLine("4 - MAIN->DEV");
                        Console.WriteLine("-------------");
                        Console.WriteLine("5 - DEV->MAIN");
                        Console.WriteLine("6 - SHELVE->DEV");
                        tipo = Console.ReadLine();
                        Console.WriteLine("OK");
                    }

                    if(tipo == "6")
                    {

                        Console.Write("Digite o nome do ShelveSet:");
                        shelveName = Console.ReadLine();
                        Console.WriteLine("OK");

                        Console.Write("Digite o nome do Usuário:");
                        userName = Console.ReadLine();
                        Console.WriteLine("OK");

                        //merge de task
                        processo = Process.Start("tf", string.Format(" unshelve /noprompt /recursive \"{0};{1}\"", shelveName, userName));

                        //Console.WriteLine("tf" + string.Format(" merge /recursive /version:C{0}~C{0} /lock:none {1} {2}", changeSet, diretorioUIOrigem, diretorioUIDestino));
                        processo.WaitForExit();

                    }
                    else
                    {
                        //UI
                        string diretorioUIOrigem = string.Format(padraoDiretorioUI, branchs[Convert.ToInt32(branch)].ToString(), tipos[Convert.ToInt32(tipo)].ToString(), diretorios[Convert.ToInt32(branch)].ToString());
                        string diretorioUIDestino = string.Format(padraoDiretorioUI, branchs[Convert.ToInt32(branch)].ToString(), tipos[Convert.ToInt32(tipo) + 1].ToString(), diretorios[Convert.ToInt32(branch)].ToString());
                        processo = Process.Start("tf", string.Format(" merge /recursive /version:C{0}~C{0} /lock:none {1} {2}", changeSet, diretorioUIOrigem, diretorioUIDestino));
                        //Console.WriteLine("tf" + string.Format(" merge /recursive /version:C{0}~C{0} /lock:none {1} {2}", changeSet, diretorioUIOrigem, diretorioUIDestino));
                        processo.WaitForExit();

                        //Servico
                        string diretorioServicoOrigem = string.Format(padraoDiretorioServico, branchs[Convert.ToInt32(branch)].ToString(), tipos[Convert.ToInt32(tipo)].ToString(), diretorios[Convert.ToInt32(branch)].ToString());
                        string diretorioServicoDestino = string.Format(padraoDiretorioServico, branchs[Convert.ToInt32(branch)].ToString(), tipos[Convert.ToInt32(tipo) + 1].ToString(), diretorios[Convert.ToInt32(branch)].ToString());
                        processo = Process.Start("tf", string.Format(" merge /recursive /version:C{0}~C{0} /lock:none {1} {2}", changeSet, diretorioServicoOrigem, diretorioServicoDestino));
                        //Console.WriteLine("tf" + string.Format(" merge /recursive /version:C{0}~C{0} /lock:none {1} {2}", changeSet, diretorioServicoOrigem, diretorioServicoDestino));
                        processo.WaitForExit();

                        //Process
                        string diretorioProcessOrigem = string.Format(padraoDiretorioProcess, branchs[Convert.ToInt32(branch)].ToString(), tipos[Convert.ToInt32(tipo)].ToString(), diretorios[Convert.ToInt32(branch)].ToString());
                        string diretorioProcessDestino = string.Format(padraoDiretorioProcess, branchs[Convert.ToInt32(branch)].ToString(), tipos[Convert.ToInt32(tipo) + 1].ToString(), diretorios[Convert.ToInt32(branch)].ToString());
                        processo = Process.Start("tf", string.Format(" merge /recursive /version:C{0}~C{0} /lock:none {1} {2}", changeSet, diretorioProcessOrigem, diretorioProcessDestino));
                        //Console.WriteLine("tf" + string.Format(" merge /recursive /version:C{0}~C{0} /lock:none {1} {2}", changeSet, diretorioProcessOrigem, diretorioProcessDestino));
                        processo.WaitForExit();

                        //Config
                        string diretorioConfigOrigem = string.Format(padraoDiretorioConfig, branchs[Convert.ToInt32(branch)].ToString(), tipos[Convert.ToInt32(tipo)].ToString(), diretorios[Convert.ToInt32(branch)].ToString());
                        string diretorioConfigDestino = string.Format(padraoDiretorioConfig, branchs[Convert.ToInt32(branch)].ToString(), tipos[Convert.ToInt32(tipo) + 1].ToString(), diretorios[Convert.ToInt32(branch)].ToString());
                        processo = Process.Start("tf", string.Format(" merge /recursive /version:C{0}~C{0} /lock:none {1} {2}", changeSet, diretorioConfigOrigem, diretorioConfigDestino));
                        //Console.WriteLine("tf" + string.Format(" merge /recursive /version:C{0}~C{0} /lock:none {1} {2}", changeSet, diretorioConfigOrigem, diretorioConfigDestino));
                        processo.WaitForExit();
                    }

                    Console.WriteLine("MERGE REALIZADO");
                }
                else
                {
                    Console.Write("Digite o Diretorio Origem:");
                    diretorioOrigem = Console.ReadLine();
                    Console.WriteLine("OK");
                    Console.Write("Digite o Diretorio Destino:");
                    diretorioDestino = Console.ReadLine();
                    Console.WriteLine("OK");

                    processo = Process.Start("tf", string.Format(" merge /recursive /version:C{0}~C{0} /lock:none {1} {2}", changeSet, diretorioOrigem, diretorioDestino));
                    //Console.WriteLine("tf" + string.Format(" merge /recursive /version:C{0}~C{0} /lock:none {1} {2}", changeSet, diretorioOrigem, diretorioDestino));
                    processo.WaitForExit();

                    Console.WriteLine("MERGE REALIZADO");
                }

                Console.Write("Deseja realizar Checkin agora? (S/N): ");
                checkIn = Console.ReadLine();
                executado = true;
                Console.WriteLine("OK");
            }



            processo = Process.Start("tf", string.Format(" checkin /author:{0} /comment:\"{1} - {2} {3} - ({4})\" /notes:\"Codigo Aprovado={0}\"",
                System.Configuration.ConfigurationSettings.AppSettings["usuario"].ToString(),
                System.Configuration.ConfigurationSettings.AppSettings["nome"].ToString(),
                System.Configuration.ConfigurationSettings.AppSettings["texto"].ToString(),
                bug,
                (tipo == string.Empty) ? string.Empty : listaBranchs[Convert.ToInt32(tipo)].ToString()));

            //Console.WriteLine("tf" + string.Format(" checkin /author:{0} /comment:\"{1} - {2} {3} - ({4})\" /notes:\"Codigo Aprovado={0}\"",
            //    System.Configuration.ConfigurationSettings.AppSettings["usuario"].ToString(),
            //    System.Configuration.ConfigurationSettings.AppSettings["nome"].ToString(),
            //    System.Configuration.ConfigurationSettings.AppSettings["texto"].ToString(),
            //    bug,
            //    (tipo == string.Empty) ? string.Empty : tipos[Convert.ToInt32(tipo)].ToString()));

            processo.WaitForExit();


            Console.WriteLine("CHECKIN REALIZADO");
            
        }
    }
}
